Nu kontrollerar UserResource om en resurs redan finns i cache. Om den gör det, returneras den cachade resursen. Annars initieras en ny förfrÄgan, och det resulterande promiset lagras i cachen. Detta sÀkerstÀller att endast en förfrÄgan görs för varje unikt userId.

2. AnvÀnda ett dedikerat cachningsbibliotek (t.ex. `lru-cache`)

För mer komplexa cachningsscenarier, övervÀg att anvÀnda ett dedikerat cachningsbibliotek som lru-cache eller liknande. Dessa bibliotek erbjuder funktioner som cache-evakuering baserad pÄ Least Recently Used (LRU) eller andra policyer, vilket kan vara avgörande för att hantera minnesanvÀndning, sÀrskilt nÀr man hanterar ett stort antal resurser.

Installera först biblioteket:

            
npm install lru-cache

            

Integrera det sedan i din UserResource:

            
import React, { Suspense } from 'react';
import LRUCache from 'lru-cache';

const fetchUser = (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simulera nÀtverksanrop
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({ id: userId, name: `User ${userId}`, email: `user${userId}@example.com` });
    }, 1000); // Simulera nÀtverkslatens
  });
};

const cache = new LRUCache({
  max: 100, // Maximalt antal objekt i cachen
  ttl: 60000, // Levnadstid i millisekunder (1 minut)
});

const UserResource = (userId) => {
  if (!cache.has(userId)) {
    let promise = null;
    let status = 'pending'; // pending, success, error
    let result;

    const suspender = fetchUser(userId).then(
      (r) => {
        status = 'success';
        result = r;
        cache.set(userId, {
          read() {
            return result;
          },
        });
      },
      (e) => {
        status = 'error';
        result = e;
        cache.set(userId, {
          read() {
            throw result;
          },
        });
      }
    );

    cache.set(userId, {
        read() {
            if (status === 'pending') {
                throw suspender;
            } else if (status === 'error') {
                throw result;
            }
            return result;
        }
    });
  }

  return cache.get(userId);
};


const UserProfile = ({ userId }) => {
  const user = UserResource(userId).read();
  return (
    

User Profile

ID: {user.id}

Name: {user.name}

Email: {user.email}

); }; const UserDetails = ({ userId }) => { const user = UserResource(userId).read(); return (

User Details

ID: {user.id}

Name: {user.name}

); }; const App = () => { return ( Loading...
}> ); }; export default App;

Detta tillvÀgagÄngssÀtt ger mer kontroll över cachens storlek och utgÄngspolicy.

3. Sammanslagning av förfrÄgningar (Request Coalescing) med bibliotek som `axios-extensions`

Bibliotek som axios-extensions erbjuder mer avancerade funktioner som sammanslagning av förfrÄgningar (request coalescing). Request coalescing kombinerar flera identiska förfrÄgningar till en enda förfrÄgan, vilket ytterligare optimerar nÀtverksanvÀndningen. Detta Àr sÀrskilt anvÀndbart i scenarier dÀr förfrÄgningar initieras mycket nÀra varandra i tiden.

Installera först biblioteket:

            
npm install axios axios-extensions

            

Konfigurera sedan Axios med den cache-adapter som tillhandahÄlls av axios-extensions.

Exempel med `axios-extensions` för att skapa en resurs:

            
import React, { Suspense } from 'react';
import axios from 'axios';
import { cacheAdapterEnhancer, throttleAdapterEnhancer } from 'axios-extensions';

const instance = axios.create({
  baseURL: 'https://api.example.com', // ErsÀtt med din API-slutpunkt
  adapter: cacheAdapterEnhancer(axios.defaults.adapter, { enabledByDefault: true }),
});

const fetchUser = async (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simulera nÀtverksanrop
  const response = await instance.get(`/users/${userId}`);
  return response.data;
};


const UserResource = (userId) => {
    let promise = null;
    let status = 'pending'; // pending, success, error
    let result;

    const suspender = fetchUser(userId).then(
        (r) => {
            status = 'success';
            result = r;
        },
        (e) => {
            status = 'error';
            result = e;
        }
    );

    return {
        read() {
            if (status === 'pending') {
                throw suspender;
            } else if (status === 'error') {
                throw result;
            }
            return result;
        },
    };
};


const UserProfile = ({ userId }) => {
  const user = UserResource(userId).read();
  return (
    

User Profile

ID: {user.id}

Name: {user.name}

Email: {user.email}

); }; const UserDetails = ({ userId }) => { const user = UserResource(userId).read(); return (

User Details

ID: {user.id}

Name: {user.name}

); }; const App = () => { return ( Loading...
}> ); }; export default App;

Detta konfigurerar Axios att anvÀnda en cache-adapter, vilket automatiskt cachar svar baserat pÄ förfrÄgningens konfiguration. Funktionen cacheAdapterEnhancer erbjuder alternativ för att konfigurera cachen, som att stÀlla in en maximal cachestorlek eller utgÄngstid. throttleAdapterEnhancer kan ocksÄ anvÀndas för att begrÀnsa antalet förfrÄgningar som görs till servern inom en viss tidsperiod, vilket ytterligare optimerar prestandan.

BÀsta praxis för resursdeduplicering

Globala övervÀganden för datahÀmtning och deduplicering

NÀr man utformar strategier för datahÀmtning för en global publik spelar flera faktorer in:

Till exempel kan en resebokningswebbplats som riktar sig till en global publik anvÀnda ett CDN för att servera data om flyg- och hotelltillgÀnglighet frÄn servrar i olika regioner. Webbplatsen skulle ocksÄ anvÀnda ett API för valutaomvandling för att visa priser i anvÀndarens lokala valuta och erbjuda alternativ för att filtrera sökresultat baserat pÄ sprÄkpreferenser.

Slutsats

Resursdeduplicering Àr en vÀsentlig optimeringsteknik för React-applikationer som anvÀnder Suspense. Genom att förhindra duplicerade datahÀmtningsförfrÄgningar kan du avsevÀrt förbÀttra prestandan, minska serverbelastningen och förbÀttra anvÀndarupplevelsen. Oavsett om du vÀljer att implementera en enkel promise-cache eller utnyttja mer avancerade bibliotek som lru-cache eller axios-extensions, Àr nyckeln att förstÄ de underliggande principerna och vÀlja den lösning som bÀst passar dina specifika behov. Kom ihÄg att övervÀga globala faktorer som CDN:er, lokalisering och tillgÀnglighet nÀr du utformar dina datahÀmtningsstrategier för en mÄngsidig publik. Genom att implementera dessa bÀsta praxis kan du bygga snabbare, effektivare och mer anvÀndarvÀnliga React-applikationer.

React Suspense resursdeduplicering: Förhindra duplicerade förfrÄgningar | MLOG | MLOG